//****************************************************************************************
//汎用シリアル通信クラス
//****************************************************************************************

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;

import gnu.io.*;

class Serial_Base
{
 //=============================================================================
 //クラスのフィールド
 SerialPort port;
 CommPortIdentifier comID;

 String comName;
 int baudRate;

 InputStream in;
 OutputStream out;
 BufferedReader reader;


 //=============================================================================
 //ポートオープンの関数
 boolean Serial_open(String Com_Name,int Baud_Rate)
 {
  //受け取った引数を自分のフィールドにも反映させておきます。
  comName = Com_Name;
  baudRate = Baud_Rate;

  //----------------------------------------------------------------------------
  //ポートIDを取得
  try
  {
   //フィールドのcomNameの名前で新規にCOMポートを取得
   comID = CommPortIdentifier.getPortIdentifier(comName);
  }
  catch(Exception e1)
  {
   JOptionPane.showMessageDialog(null,"ポートを取得できませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE);
   return false;
  }

  //----------------------------------------------------------------------------
  //もしポートが既に開いていないなら、ポートを開いて各種設定を行います。
  if(comID.isCurrentlyOwned()==false)
  {
   try
   {
    //シリアルポートのインスタンスを生成
    port = (SerialPort)comID.open("serial_canvas",2000);

    //ボーレート、データビット数、ストップビット数、パリティを設定
    port.setSerialPortParams(baudRate,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE );

    //フロー制御はしない
    port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

    //入出力ストリームの設定
    in = port.getInputStream();
    out = port.getOutputStream();
    reader = new BufferedReader(new InputStreamReader(port.getInputStream()));
   }
   catch(Exception e2)
   {
    JOptionPane.showMessageDialog(null,"うまく開けませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE);
    return false;
   }
  }
  else
  {
   JOptionPane.showMessageDialog(null,"すでに開いています。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE);
   return false;
  }

  //正常終了ならtrueを返します。
  return true;

 }


 //=============================================================================
 //ポートクローズの関数
 boolean Serial_close()
 {
  if(comID.isCurrentlyOwned())
  {
   try
   {
    //全部クローズ。
    port.close();
    in.close();
    out.close();
   }
   catch(IOException e3)
   {
    JOptionPane.showMessageDialog(null,"うまく閉じれませんでした。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE);
    return false;
   }
  }
  else
  {
   JOptionPane.showMessageDialog(null,"すでに閉じています。","Serial_Base.open()",JOptionPane.INFORMATION_MESSAGE);
   return false;
  }

  //正常終了ならtrueを返します。
  return true;

 }

 //=============================================================================
 //文字列送信関数
 void Serial_puts(String str)
 {
  try
  {
   //String型の引数をbyte配列にする。
   byte[] data = str.getBytes();

   //アウトプットストリームを介して送信します。
   out.write(data);
   out.flush();
  }
  catch(Exception e4)
  {
  }
 }

 String Serial_read()
 {
	 String str=null;
	 try {
		str = reader.readLine();
	} catch (IOException e) {
		// TODO 自動生成された catch ブロック
		e.printStackTrace();
	}
	 return str;
 }

 void Serial_write(byte[] data)
 {
  try
  {
   out.write(data);
   out.flush();
  }
  catch(Exception e4)
  {
  }
 }

 void Serial_write(byte[] data,int offset,int len)
 {
  try
  {
   out.write(data,offset,len);
   out.flush();
  }
  catch(Exception e4)
  {
  }
 }

 boolean Serial_available()
 {
	int count = 0;
	try {
		while (in.available()<=0)
		{
			if(count++ == common.SERIAL_SLEEP_MAX)return false;
			Thread.sleep(common.SERIAL_SLEEP_TIME);
		}
	} catch (IOException e) {
		// TODO 自動生成された catch ブロック
		e.printStackTrace();
	} catch (InterruptedException e) {
		// TODO 自動生成された catch ブロック
		e.printStackTrace();
	}
	return true;
 }
}


